package dbgorm

import (
	"strings"

	"gorm.io/gorm"
)

// grom 错误捕获插件
type tryConnect struct {
	CacheKey string // 数据库连接类型
}

// 插件名称
func (c *tryConnect) Name() string {
	return "try.connect"
}

// 回调
func (c *tryConnect) Initialize(db *gorm.DB) error {
	db.Callback().Query().After("*").Register(c.Name(), func(d *gorm.DB) { c.error_connect(d.Error) })
	db.Callback().Create().After("*").Register(c.Name(), func(d *gorm.DB) { c.error_connect(d.Error) })
	db.Callback().Update().After("*").Register(c.Name(), func(d *gorm.DB) { c.error_connect(d.Error) })
	db.Callback().Delete().After("*").Register(c.Name(), func(d *gorm.DB) { c.error_connect(d.Error) })
	db.Callback().Raw().After("*").Register(c.Name(), func(d *gorm.DB) { c.error_connect(d.Error) })
	db.Callback().Row().After("*").Register(c.Name(), func(d *gorm.DB) { c.error_connect(d.Error) })
	return nil
}

// 错误连接
//
//	err	数据库报错日志
func (c *tryConnect) error_connect(err error) {
	if err != nil {
		if strings.Contains(err.Error(), "connection refused") {
			// 连接异常
			if v, ok := _cache.Load(c.CacheKey); ok {
				temp := v.(*OptionInfo)
				if db, err := temp.DB.DB.DB(); err == nil {
					db.Close()
				}
			}
			_cache.Delete(c.CacheKey)
		}
	}
}
